<?php
// на основе обработчика Generic/Static, вышлет файл из файлохранилища

class Action_Community_Filestorage extends RL_Handler
{

	public function process ()
	{
		$this->response = $this->rh->response;

		// Рассматриваем простую ситуацию когда передан oid
		$query['filestorage']['oid']['=='] = $this->params['file_oid'];
		
		$find_result = $this->ctx->store->find( $query );
		$file = $find_result->next();
		$file_meta = $file->data;
		
		// определим где искать файлы
		$document_root = isset($this->params["document_root"])
			? $this->ctx->rh->project_dir. $this->params["document_root"]
			:	$_SERVER['HTTP_DOCUMENT_ROOT'];

		// полный путь к файлу
		$ffull_path = rtrim($file_meta['path_to_file'], '/');
	
		if (is_file($ffull_path)) {
			
			// это действительно файл

			$this->ctx->rh->useClass('RL_View');
			$view = RL_View::create($this->ctx, 'File');
			
			$view->getMeta()->setFileName($file_meta['real_fname']);
			$view->getMeta()->setMimeType($file_meta['mime_type']);

			$view->setPath($ffull_path);

			if (isset( $this->params['mode'] )) {
				$this->response->protocol->setDownloadMode(intval($this->params['mode']));
			}
			$this->response->setContent($view);
		} elseif (isset ($this->params['show_indexes']) && is_dir($ffull_path)) {
			// это директория и нам можно листать
			// TODO : 2007-08-01 : lucky
			// выкинуть алгоритм в отдельный класс
			$dir = array();

			$entries = array();
			if ($dh = opendir($ffull_path)) {
				while (($entry = readdir($dh)) !== false) {
					switch ($entry) {
					case '.': break;                     // себя не рисуем
					case '..': if (empty($fpath)) break; // мы в корневой директории, выше некуда
					default:
						$info            = new StdClass();
						$info->name      = $entry;
						$info->path      = ($fpath ? $fpath . '/' : '') . $entry;
						$info->full_path = $ffull_path . '/' . $entry;
						$info->is_dir    = is_dir($info->full_path);
						$info->is_file   = is_file($info->full_path);
						$info->mime      = ($info->is_file) ? $this->ctx->mime->file($info->full_path)
						                                    : '';
						$entries[] = $info;
					}
				}
				closedir($dh);
			}

			$dir['entry'] = $entries;
			$dir['path']  = $this->params['entry'];


			$this->ctx->rh->useClass('RL_View');
			$view = $this->ctx->rh->views->findByName('generic/directory');
			$view->data['req'] = $this->params;
			$view->data['dir'] = $dir;
			$this->response->setContent($view);
		} else {
			// это не файл и не директория, а что-то другое
			// возможно, этого вообще нет
			// 404
		}
	} // end of function process

} // end of class Action_Generic_Static

